#!/bin/sh

#       bash   exp_by_user.sh  
#########################  只产生脚本不执行 !!!!!  ########## 
    #通过文件读取用户  ++
    #导一个用户，写用户名到文件，比较两个文件  ++

# 通过 cyg win 做脚本测试
# bash  -n    //做语法检查
# 导出，上传，删除，日志
# 最好是 导出用户名=存放文件夹=上传后删除文件夹内的文件+并且文件夹改名为+_upok
# ftp服务器与本的结构一样，
# 最后比对文件个数，和大小
# 建立3个模块 导出模块，上传模块，删除模块
# 校验模块 
# 保存每次 执行的命令，
#  用绝对路径，
#  cmd_put.txt 保存循环的命令 ，run_cmd_${loop_arg}.[exp|ftp] 被调用的脚本 ,run_cmd_${loop_arg}.[exp|ftp].out 脚本输出
# mkexp_mod(){默认参数10个文件每个10G}   ftp_backup_mod()   check_file_mod()  check_file_mod()
    # cp_backup_mod() 通过网络文件系统 移动数据
#######################################
#  
#  spool /tmp/6x1_mk_ts.txt ;
#  SELECT DBMS_METADATA.GET_DDL('USER',U.username)  from DBA_USERS  u ;
#  spool off;
#
#
#     expdp 'sys/woshiug@61.164.81.188:1521/orcoo as sysdba'  DIRECTORY=dump_dir dumpfile=td.dmp TABLES=ot,tb
    

########################
#-------------------------------参数变量---------------------
#-----基本参数
sh_sn=sh_ef1       #脚本编号  
exp_dir=D:/cygwin/tmp                #导出目录 (不需要/)
exp_do=1    #1产生脚本并执行和移动数据,0产生脚本不执行
win_is=1
db_charset=''   #  export NLS_LANG="simplified chinese_china".zhs16gbk



#-----exp参数
exp_arg_userlist=/cygdrive/d/explist.txt    #用户列表(文件最后加空行)
exp_login_str='sys/oracle@192.168.0.137/dgx as sysdba' 
    
    
    
#----移动路径
move_backup=0         #0=不移动 1=ftp 2=cp
move_path=z:/           #移动备份路径
    
    
#-----ftp参数
ftp_ip=127.0.0.1
ftp_port=21
ftp_user=jack
ftp_pass=oracle
ftp_server_dir=/

#-----通过配置文件载入配置
conf_file=''
# . $conf_file

show_conf_mod(){
    
    echo "show_conf_mod"
}


#-------------------------------定义函数---------------------------
#----载入要导出的用户列表
load_exp_arg_mod(){
    userlist_file_mv=$exp_arg_userlist
    _tmp_num=0
    while read tmp_str
    do
        #去空
        tmp_str=${tmp_str% }
        tmp_str=${tmp_str# }
        if  !  [[   $tmp_str ]] 
        then
            continue
        fi
        _exp_user_arr[$_tmp_num]=$tmp_str
        #echo  $_tmp_num '=='$tmp_str

        let _tmp_num=_tmp_num+1
    done < $userlist_file_mv   
    echo '用户列表文件 ' $userlist_file_mv

}

#----显示用户
show_user_mod(){
    _tmp_len=${#_exp_user_arr[@]}
    _tmp_i=-1
    _tmp_str=''
    while [ 1 ]
    do 
        let _tmp_i=_tmp_i+1
        if  [[  $_tmp_i -ge $_tmp_len   ]]
        then 
            break
        fi
        _tmp_str=${_tmp_str}${_tmp_i}':'${_exp_user_arr[$_tmp_i]}'   '
        #--显示十个$(let _tmp_len-_tmp_i)
        let _tmp_x=_tmp_len-_tmp_i
        #echo $_tmp_x
        if [ $_tmp_len -ge 10 ] && [  $_tmp_i -ge 3 ]  &&  [  $_tmp_x -gt 3  ]
        then
            let _tmp_i=_tmp_len-3
            _tmp_str=${_tmp_str}' ....... '
        fi
    done   
         
    echo  '一共' ${#_exp_user_arr[@]}  '用户  分别是 ' $_tmp_str
}

#----导出函数
mkexp_mod(){
    exp_user=${1}
    # init 
    #echo '------------' $exp_user '------------'
    mkdir -p $_exp_dir/$exp_user
    
    exp_file_size=20G  #导出分段大小
    exp_file_num=50    #分段文件数
        
    exp_par_fun=$_exp_dir/${exp_user}/run_cmd_.par
    #--叠加文件名
    exp_file=$_exp_dir/${exp_user}/${exp_user}_0.dump
    _tmp_num=1
    while  [ $_tmp_num -le $exp_file_num  ] 
    do
        exp_file=${exp_file},$_exp_dir/${exp_user}/${exp_user}_$_tmp_num.dump
        let _tmp_num=_tmp_num+1
    done        
        
    # 写参数文件 
    cat >$exp_par_fun  <<EO

owner=${exp_user}
filesize=$exp_file_size 
file=$exp_file

grants=y
    
EO
    exp_cmd_str=" exp  '$exp_login_str' parfile=$exp_par_fun  log=$_exp_dir/${exp_user}/run_cmd_.log  "
    echo $exp_cmd_str |tee $_exp_dir/${exp_user}_exp.cmd |tee -a $_exp_dir/allexp.cmd 

}
#--执行exp
expdo_mod(){
    exp_user=${1}
    
    expdo=$_exp_dir/${exp_user}_exp.cmd
        
    #执行-------以及移动数据
    $expdo   
    _cmd_state=$?
    if  !  [[ $_cmd_state -eq  0   ]]
    then 
        echo 'exp error _line_ '  "$_cmd_state" 
    fi
        
    #ftp  移动数据    
    if  [[  $move_backup -eq  1   ]]
    then 
        ftp_backup_mod  ${_exp_user_arr[$_tmp_i]}
    fi
    #cp  移动数据    
    if  [[  $move_backup -eq  1   ]]
    then 
        cp_backup_mod   ${_exp_user_arr[$_tmp_i]}
    fi
        
 }


#----初始化 各就各位  
exp_gjgw_mod(){
    if [ $win_is -eq 1 ]
    then
        echo 'window os '
    else
        echo 'unix os '
    fi
    #-----脚本内部变量 初始化
    _exp_dir=$exp_dir/${sh_sn}       
    _cmd_state=0       #默认运行状态

    #-----
    echo '脚本编号 sh_ef1'
    mkdir -p   $_exp_dir 
    echo '导出目录=' $_exp_dir  
    echo  "是否确认  (y/n)"    
    read   yorn       
    if [ $yorn = 'n' ]
    then
        echo 'exit!'
        exit 0
    fi
}


#--------------------------开始loop
loop_mkexp(){
    
    _tmp_len=${#_exp_user_arr[@]}
    _tmp_i=-1
    while [ 1 ]
    do 
        let _tmp_i=_tmp_i+1
        if  [[  $_tmp_i -ge $_tmp_len   ]]
        then 
            break
        fi
        #echo ${_exp_user_arr[$_tmp_i]} 
        mkexp_mod ${_exp_user_arr[$_tmp_i]} 

    done 
  
}

loop_expdo_mod(){
    
    _tmp_len=${#_exp_user_arr[@]}
    _tmp_i=-1
    while [ 1 ]
    do 
        let _tmp_i=_tmp_i+1
        if  [[  $_tmp_i -ge $_tmp_len   ]]
        then 
            break
        fi
        #echo ${_exp_user_arr[$_tmp_i]} 
        mkexp_mod ${_exp_user_arr[$_tmp_i]} 

    done 
  
}




#------------------------移动数据----------------------
    #    _move_path=$move_path/${sh_sn}     

#--校验 复制后的文件! 
cp_log_mod(){
    mkdir -p $_exp_dir/logall_check/  
    logall_arr_len=${#logall_arr[@]}
    _tmp_i=-1
    while [ 1 ]
    do 
        let _tmp_i=_tmp_i+1
        if  [[  $_tmp_i -ge $logall_arr_len   ]]
        then 
            break
        fi
        cp -av ${logall_arr[$_tmp_i]}  $_exp_dir/logall_check/ 
     done   
        

}
    



#---- ftp上传
ftp_backup_mod(){
    #init
    server_dir_fun=$ftp_server_dir
    local_dir_fun=$_exp_dir/${1}
        
    #产生脚本
    cat >$_exp_dir/${1}.ftp <<EO
open $ftp_ip $ftp_port



user  $ftp_user $ftp_pass
prompt off 
binary
mkdir $server_dir_fun
mkdir $server_dir_fun/${1}
cd $server_dir_fun/${1}
dir
lcd $local_dir_fun
pwd
mput *.*
dir
!dir
EO
        

    ftp_cmd_fun="ftp -n <$_exp_dir/${1}.ftp | tee $_exp_dir/${1}.ftp.out "
    echo ' ----------------ftp---------------'
    echo $ftp_cmd_fun | tee $_exp_dir/${1}.ftp.cmd 
    #实行 ftp
    #$ftp_cmd_fun   
        
    _tmp_state_fum=$?
    if [[  $_tmp_state_fum -eq 0 ]]
    then
         echo rm -fr $local_dir_fun/?*
         echo mv $local_dir_fun  ${local_dir_fun}_upok
    else
        echo '----------ftp upload false--------'
    fi
        
}

#----网络拷贝
cp_backup_mod(){
    
    server_dir_fun=/$sh_sn/${1}
    local_dir_fun=$_exp_dir/${1}    
    
    cp -av    $local_dir_fun/?*   $server_dir_fun/?*
}
#-------------------------------单元测试
unit_test_mod(){
    
    load_exp_arg_mod
    show_user_mod
    exp_gjgw_mod     
    loop_mkexp
        
    if [[  $_tmp_state_fum -eq 0 ]]
    then
        loop_expdo_mod 
    fi
        
    cp_log_mod  

    
    echo 'exec file '   "$_exp_dir/allexp.cmd" 
    echo 'cmd_state='   "$_cmd_state"
} 
   
unit_test_mod 
exit 0





